

USE SIGCSM_P1
GO

IF EXISTS (SELECT * FROM  dbo.sysobjects WHERE id = object_id(N'[dbo].[sp_asignarValoresConfiguracion]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
DROP PROCEDURE sp_asignarValoresConfiguracion    
GO

IF EXISTS (SELECT * FROM  dbo.sysobjects WHERE id = object_id(N'[dbo].[sp_asignarGeneracionYPoblacion]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
DROP PROCEDURE sp_asignarGeneracionYPoblacion    
GO

IF EXISTS (SELECT * FROM  dbo.sysobjects WHERE id = object_id(N'[dbo].[sp_registrarDetalleCromosoma]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
DROP PROCEDURE sp_registrarDetalleCromosoma    
GO

IF EXISTS (SELECT * FROM  dbo.sysobjects WHERE id = object_id(N'[dbo].[sp_obtnerMojoresCromosomasDeGeneracion]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
DROP PROCEDURE sp_obtnerMojoresCromosomasDeGeneracion    
GO

IF EXISTS (SELECT * FROM  dbo.sysobjects WHERE id = object_id(N'[dbo].[sp_eliminarGeneracionCromosomaPoblacionYFitnes]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
DROP PROCEDURE sp_eliminarGeneracionCromosomaPoblacionYFitnes    
GO


CREATE PROCEDURE sp_asignarValoresConfiguracion(
   @NUMEROPACIENTESACONSIDERAR	INT,
   @NUMEROPOBLACIONACONSIDERAR	INT,
   @PROBABIBLIDADCROSSOVER		NUMERIC(18,8),
   @PROBABILIDADMUTACION		NUMERIC(18,8),
   @NUMEROGENERACIONACONSIDERAR	INT,
   @NUMEROHALLAZGOSACONSIDERAR	INT,
   @CODIGOORGANIZACIONES		VARCHAR(20),
   @LISTANUMEROREGLASACONSIDERAR	VARCHAR(20)
	
   
)AS
BEGIN
  
  
  	INSERT INTO  SM_CONFIGURACION
		(NUMEROPACIENTESACONSIDERAR, NUMEROPOBLACIONACONSIDERAR, PROBABIBLIDADCROSSOVER, PROBABILIDADMUTACION,
		 NUMEROGENERACIONACONSIDERAR, NUMEROHALLAZGOSACONSIDERAR)
	VALUES(
		@NUMEROPACIENTESACONSIDERAR, @NUMEROPOBLACIONACONSIDERAR, @PROBABIBLIDADCROSSOVER, @PROBABILIDADMUTACION,
		@NUMEROGENERACIONACONSIDERAR, @NUMEROHALLAZGOSACONSIDERAR)
	
	DECLARE @CODIGOCONFIGURACION INT
	SET @CODIGOCONFIGURACION = @@IDENTITY 
 	
	DECLARE @NUMEROREGLASACONSIDERAR INT, @CODIGOORGANIZACION	INT
	
	WHILE( SELECT LEN(@CODIGOORGANIZACIONES)) > 0
	BEGIN
		SET @CODIGOORGANIZACION =CONVERT(INT, SUBSTRING(@CODIGOORGANIZACIONES,0,2))
		SET @NUMEROREGLASACONSIDERAR =CONVERT(INT, SUBSTRING(@LISTANUMEROREGLASACONSIDERAR,0,2))
		
		INSERT INTO SM_CONFIGURACIONORGANIZACION
			(CODIGOCONFIGURACION, CODIGOORGANIZACION, NUMEROREGLASACONSIDERAR)
		VALUES (
			@CODIGOCONFIGURACION, @CODIGOORGANIZACION,@NUMEROREGLASACONSIDERAR)
		
		
		IF( LEN(@CODIGOORGANIZACIONES) > 1 )
		BEGIN
			SET @CODIGOORGANIZACIONES = SUBSTRING(@CODIGOORGANIZACIONES, 3, LEN(@CODIGOORGANIZACIONES)-2)
			SET @LISTANUMEROREGLASACONSIDERAR = SUBSTRING(@LISTANUMEROREGLASACONSIDERAR, 3, LEN(@LISTANUMEROREGLASACONSIDERAR)-2)
		END
		ELSE
		BEGIN
			SET @CODIGOORGANIZACIONES =''
			SET @LISTANUMEROREGLASACONSIDERAR =''
		END
	END
		
END
GO

CREATE PROCEDURE sp_asignarGeneracionYPoblacion(
   @NUMEROGENERACION	INT,
   @DETALLE				VARCHAR(100),
   @ITERACIONES			INT,
   @NUMEROPOBLACIONINICIAL	INT,
   @NUMEROPOBLACIONFINAL	INT	
   
)AS
BEGIN
	INSERT INTO SM_GENERACION
		(NUMEROGENERACION, DETALLE, ITERACIONES)
	VALUES
		(@NUMEROGENERACION,@DETALLE,@ITERACIONES)
	
	
	INSERT INTO SM_POBLACION
		(NUMEROGENERACION,NUMEROPOBLACIONINICIAL,NUMEROPOBLACIONFINAL)
	VALUES
		(@NUMEROGENERACION, @NUMEROPOBLACIONINICIAL,@NUMEROPOBLACIONFINAL)
	
END
GO
--SP_HELPTEXT sp_registrarDetalleCromosoma
CREATE PROCEDURE sp_registrarDetalleCromosoma(
	@NUMEROCROMOSOMA		INT ,
	@PARENTESCO				VARCHAR(50),
	@GENERACIONACIMIENTO	INT,
	@GENERACIONFALLECIMIENTO	INT,
	@PADRE					VARCHAR(20),
	@MADRE					VARCHAR(20),
	@FLAGSELECCION			INT,
	@ESTADO					VARCHAR(1),
	@NUMEROGENERACION		INT,
	@NUMEROPOSICION			INT,
	@VALORADAPTACION		NUMERIC(18,8)

)
AS
BEGIN
		IF (@GENERACIONFALLECIMIENTO = 0)
			SET @GENERACIONFALLECIMIENTO = null
		
		
		IF NOT EXISTS (SELECT * FROM SM_CROMOSOMA WHERE NUMEROCROMOSOMA = @NUMEROCROMOSOMA)
		BEGIN
			INSERT INTO SM_CROMOSOMA
				(NUMEROCROMOSOMA, PARENTESCO, GENERACIONACIMIENTO, GENERACIONFALLECIMIENTO, 
				 PADRE, MADRE, FLAGSELECCION, ESTADO)
			VALUES
				(@NUMEROCROMOSOMA, @PARENTESCO, @GENERACIONACIMIENTO, @GENERACIONFALLECIMIENTO, 
					@PADRE, @MADRE, @FLAGSELECCION, @ESTADO)
		END
		ELSE
		BEGIN
			 UPDATE		SM_CROMOSOMA 
				SET		PARENTESCO = @PARENTESCO,
						GENERACIONFALLECIMIENTO =@GENERACIONFALLECIMIENTO
			  WHERE		NUMEROCROMOSOMA = @NUMEROCROMOSOMA				
		END	
	
	
		INSERT INTO SM_CROMOSOMAGENERACIONVALORFITNNES
			(NUMEROGENERACION, NUMEROCROMOSOMA, NUMEROPOSICION, VALORADAPTACION)
		 VALUES
		 (@NUMEROGENERACION, @NUMEROCROMOSOMA, @NUMEROPOSICION, @VALORADAPTACION)
		 
	
END
GO

CREATE PROCEDURE sp_obtnerMojoresCromosomasDeGeneracion(
	@NUMEROGENERACION INT
)
AS
BEGIN

		DECLARE @TAM_POBLACION INTEGER
		
		SELECT @TAM_POBLACION = NUMEROPOBLACIONFINAL/2 FROM SM_POBLACION WHERE NUMEROGENERACION = @NUMEROGENERACION
		
		EXEC(  'SELECT			TOP ' + @TAM_POBLACION + '
								C.NUMEROCROMOSOMA,
								CGF.NUMEROPOSICION,
								CGF.VALORADAPTACION,
								CGF.NUMEROGENERACION
				FROM			SM_CROMOSOMA C
				INNER JOIN		SM_CROMOSOMAGENERACIONVALORFITNNES CGF ON C.NUMEROCROMOSOMA = CGF.NUMEROCROMOSOMA
				WHERE			CGF.NUMEROGENERACION = '+@NUMEROGENERACION+'
								--AND (@NUMEROGENERACION - C.GENERACIONACIMIENTO ) < 5
								AND C.GENERACIONFALLECIMIENTO IS NULL --AUN VIVOS
				ORDER BY		VALORADAPTACION DESC ')
		
		
		
		EXEC(  'UPDATE			SM_CROMOSOMA 
				SET				GENERACIONFALLECIMIENTO = '+@NUMEROGENERACION+'
				FROM			SM_CROMOSOMA CROM
				WHERE			NOT EXISTS
							   (SELECT			TOP ' + @TAM_POBLACION + '
												*
								FROM			SM_CROMOSOMA C
								INNER JOIN		SM_CROMOSOMAGENERACIONVALORFITNNES CGF ON C.NUMEROCROMOSOMA = CGF.NUMEROCROMOSOMA
								WHERE			CGF.NUMEROGENERACION = '+@NUMEROGENERACION + '
												--AND (@NUMEROGENERACION - C.GENERACIONACIMIENTO ) < 5
												AND CROM.NUMEROCROMOSOMA = C.NUMEROCROMOSOMA
												AND GENERACIONFALLECIMIENTO IS NULL
								)
								AND GENERACIONFALLECIMIENTO IS NULL ')
		
END

GO

CREATE PROCEDURE sp_eliminarGeneracionCromosomaPoblacionYFitnes
AS
BEGIN

	DELETE FROM SM_CROMOSOMAGENERACIONVALORFITNNES
	DELETE FROM SM_POBLACION
	DELETE FROM SM_CROMOSOMA
	DELETE FROM SM_GENERACION

END
GO